# 导入os模块，用于清屏操作
import os


# 定义打印菜单函数
def print_menu():
    # 打印菜单选项
    print("书店销售管理系统")
    print("1. 图书录入")
    print("2. 图书查询")
    print("3. 图书修改")
    print("4. 图书删除")
    print("5. 售卖图书")
    print("6. 查看库存")
    print("7. 图书分类")
    print("8. 销售统计")
    print("9. 库存统计")
    print("10.退出")
    print("请选择要执行的操作：")


# 定义添加图书函数
def add_book(store):
    # 清屏操作
    os.system('cls' if os.name == 'nt' else 'clear')
    # 创建一个空字典用于存储新图书信息
    new_book = {}
    # 输入图书的编号，并存入字典
    new_book['book_id'] = int(input("请输入图书的编号："))
    # 输入图书的名称，并存入字典
    new_book['book_name'] = input("请输入图书的名称：")
    # 输入图书的类别，并存入字典
    new_book['book_category'] = input("请输入图书的类别：")
    # 输入图书的进价，并存入字典
    new_book['purchase_price'] = float(input("请输入图书的进价："))
    # 输入图书的售价，并存入字典
    new_book['selling_price'] = float(input("请输入图书的售价："))
    # 输入图书的已售数量，并存入字典
    new_book['sold_quantity'] = int(input("请输入图书的已售数量："))
    # 输入图书的库存数量，并存入字典
    new_book['stock_count'] = int(input("请输入图书的库存数量："))

    # 将新图书信息添加到书店的图书列表中
    store['books'].append(new_book)
    # 更新图书总数
    store['book_count'] += 1

    # 打印添加成功信息
    print("图书录入成功。")


# 定义导出图书函数
def export_books(store):
    # 如果图书库存为空，则打印提示信息
    if store['book_count'] == 0:
        print("图书库存为空。")
        return

    # 打印图书列表的表头
    print("图书编号\t图书名称\t图书类别\t进价\t售价\t已售数量\t库存数量")
    # 遍历图书列表，打印每本图书的信息
    for book in store['books']:
        print(
            f"{book['book_id']}\t\t{book['book_name']}\t{book['book_category']}\t\t{book['purchase_price']:.2f}\t{book['selling_price']:.2f}\t{book['sold_quantity']}\t\t{book['stock_count']}")


# 定义查询图书函数
def search_book(store):
    # 如果图书库存为空，则打印提示信息
    if store['book_count'] == 0:
        print("图书库存为空。")
        return

    # 选择查询方式
    choice = int(input("请选择查询方式：\n1. 按编号查询\n2. 按名称查询\n"))

    # 按编号查询
    if choice == 1:
        # 输入要查询的图书编号
        book_id = int(input("请输入要查询的图书编号："))
        # 在图书列表中查找指定编号的图书
        for book in store['books']:
            # 如果找到了指定的图书，打印图书信息并返回
            if book['book_id'] == book_id:
                # 打印图书列表的表头
                print("图书编号\t图书名称\t图书类别\t进价\t售价\t已售数量\t库存数量")
                # 打印找到的图书的信息
                print(
                    f"{book['book_id']}\t\t{book['book_name']}\t{book['book_category']}\t\t{book['purchase_price']:.2f}\t{book['selling_price']:.2f}\t{book['sold_quantity']}\t\t{book['stock_count']}")
                return
        # 如果没有找到指定的图书，打印提示信息
        print("未找到指定图书。")

    # 按名称查询
    elif choice == 2:
        # 输入要查询的图书名称
        book_name = input("请输入要查询的图书名称：")
        # 在图书列表中查找指定名称的图书
        for book in store['books']:
            # 如果找到了指定的图书，打印图书信息并返回
            if book['book_name'] == book_name:
                # 打印图书列表的表头
                print("图书编号\t图书名称\t图书类别\t进价\t售价\t已售数量\t库存数量")
                # 打印找到的图书的信息
                print(
                    f"{book['book_id']}\t\t{book['book_name']}\t{book['book_category']}\t\t{book['purchase_price']:.2f}\t{book['selling_price']:.2f}\t{book['sold_quantity']}\t\t{book['stock_count']}")
                return
        # 如果没有找到指定的图书，打印提示信息
        print("未找到指定图书。")

    # 无效选择
    else:
        print("无效选择。")


# 定义修改图书函数
def modify_book(store):
    # 如果图书库存为空，则打印提示信息
    if store['book_count'] == 0:
        print("图书库存为空。")
        return

    # 输入要修改的图书编号
    book_id = int(input("请输入要修改的图书编号："))
    # 在图书列表中查找指定编号的图书
    for book in store['books']:
        # 如果找到了指定的图书，修改图书信息并返回
        if book['book_id'] == book_id:
            # 输入修改后的图书信息
            book['book_name'] = input("请输入图书的名称：")
            book['book_category'] = input("请输入图书的类别：")
            book['purchase_price'] = float(input("请输入图书的进价："))
            book['selling_price'] = float(input("请输入图书的售价："))
            book['sold_quantity'] = int(input("请输入图书的已售数量："))
            book['stock_count'] = int(input("请输入图书的库存数量："))

            # 打印修改成功信息
            print("图书修改成功。")
            return

    # 如果没有找到指定的图书，打印提示信息
    print("未找到指定图书。")


# 定义删除图书函数
def delete_book(store):
    # 如果图书库存为空，则打印提示信息
    if store['book_count'] == 0:
        print("图书库存为空。")
        return

    # 输入要删除的图书编号
    book_id = int(input("请输入要删除的图书编号："))
    # 在图书列表中查找指定编号的图书
    for book in store['books']:
        # 如果找到了指定的图书，从图书列表中删除图书并返回
        if book['book_id'] == book_id:
            store['books'].remove(book)
            store['book_count'] -= 1
            # 打印删除成功信息
            print("图书删除成功。")
            return

    # 如果没有找到指定的图书，打印提示信息
    print("未找到指定图书。")


# 定义图书分类函数
def classify_books(store):
    # 如果图书库存为空，则打印提示信息
    if store['book_count'] == 0:
        print("图书库存为空。")
        return

    # 输入要查询的图书类别
    category = input("请输入要查询的图书类别：")
    # 打印图书列表的表头
    print("图书编号\t图书名称\t图书类别\t进价\t售价\t已售数量\t库存数量")
    # 遍历图书列表，打印指定类别的图书信息
    for book in store['books']:
        if book['book_category'] == category:
            print(
                f"{book['book_id']}\t\t{book['book_name']}\t{book['book_category']}\t\t{book['purchase_price']:.2f}\t{book['selling_price']:.2f}\t{book['sold_quantity']}\t\t{book['stock_count']}")


# 定义销售统计函数
def sales_statistics(store):
    # 如果图书库存为空，则打印提示信息
    if store['book_count'] == 0:
        print("图书库存为空。")
        return

    # 打印已售图书销售统计信息
    print("已售图书销售统计：")
    # 初始化总销售额
    total_sales = 0.0
    # 遍历图书列表，计算每本图书的销售额
    for book in store['books']:
        sales = book['selling_price'] * book['sold_quantity']
        # 如果销售额大于0，打印图书编号、图书名称和销售额
        if sales > 0:
            print(f"图书编号：{book['book_id']}\n图书名称：{book['book_name']}\n销售额：{sales:.2f}\n")
            # 累加总销售额
            total_sales += sales

    # 打印总营业额和净利润
    print(f"总营业额：{total_sales:.2f}\n净利润：{total_sales - (store['book_count'] * 0.1 * total_sales):.2f}\n")


# 定义库存统计函数
def stock_statistics(store):
    # 清屏操作
    os.system('cls' if os.name == 'nt' else 'clear')
    # 打印当前图书库存信息
    print("当前图书库存为：")
    # 如果图书库存为空，则打印提示信息
    if store['book_count'] == 0:
        print("图书库存为空。")
        return

    # 初始化低库存图书数量
    low_stock_books = 0
    # 遍历图书列表，打印每本图书的编号、名称、销售额和库存数量
    for book in store['books']:
        print("——————————————————")
        print(
            f"图书编号：{book['book_id']}\n图书名称：{book['book_name']}\n图书销售额：{book['selling_price'] * book['sold_quantity']:.2f}\n库存数量：{book['stock_count']}")
        # 如果库存数量低于20，增加低库存图书数量，并打印补充库存信息
        if book['stock_count'] < 20:
            low_stock_books += 1
            print("数量过低，请及时进货补充库存。")

    # 如果低库存图书数量为0，打印库存充足信息
    if low_stock_books == 0:
        print("当前库存充足，无需进货。")


# 定义保存图书信息到文件的函数
def save_to_file(store):
    # 打开文件，并以写入的模式写入图书信息
    with open("bookstore.txt", "w") as file:
        for book in store['books']:
            file.write(
                f"{book['book_id']} {book['book_name']} {book['book_category']} {book['purchase_price']} {book['selling_price']} {book['sold_quantity']} {book['stock_count']}\n")
    # 打印保存成功信息
    print("图书信息保存成功。")


# 定义从文件中读取图书信息的函数
def read_from_file(store):
    try:
        # 尝试打开文件，并以读取的模式读取图书信息
        with open("bookstore.txt", "r") as file:
            for line in file:
                # 使用空格分隔每个字段，并将其存入字典中
                book_id, book_name, book_category, purchase_price, selling_price, sold_quantity, stock_count = line.strip().split()
                # 将图书信息存入图书列表中
                store['books'].append({
                    'book_id': int(book_id),
                    'book_name': book_name,
                    'book_category': book_category,
                    'purchase_price': float(purchase_price),
                    'selling_price': float(selling_price),
                    'sold_quantity': int(sold_quantity),
                    'stock_count': int(stock_count)
                })
                # 更新图书总数
                store['book_count'] += 1
        # 打印读取成功信息
        print("图书信息读取成功。")
    # 如果文件不存在，则打印文件打开失败信息
    except FileNotFoundError:
        print("文件打开失败。")


# 定义售卖图书函数
def sell_book(store):
    # 如果图书库存为空，则打印提示信息
    if store['book_count'] == 0:
        print("图书库存为空。")
        return

    # 选择查询方式
    choice = int(input("请选择查询方式：\n1. 按编号查询\n2. 按名称查询\n"))

    # 按编号查询
    if choice == 1:
        # 输入要售卖的图书编号
        book_id = int(input("请输入要售卖的图书编号："))
        # 在图书列表中查找指定编号的图书
        for book in store['books']:
            # 如果找到了指定的图书，打印图书信息并返回
            if book['book_id'] == book_id:
                # 打印图书列表的表头
                print("图书编号\t图书名称\t图书类别\t进价\t售价\t已售数量\t库存数量")
                # 打印找到的图书的信息
                print(
                    f"{book['book_id']}\t\t{book['book_name']}\t{book['book_category']}\t\t{book['purchase_price']:.2f}\t{book['selling_price']:.2f}\t{book['sold_quantity']}\t\t{book['stock_count']}")

                # 输入售卖的数量
                quantity = int(input("请输入售卖的数量："))

                # 如果售卖数量大于库存数量，打印库存不足提示信息，结束函数
                if quantity > book['stock_count']:
                    print("库存不足，售卖失败。")
                    return

                # 增加已售数量，减少库存数量
                book['sold_quantity'] += quantity
                book['stock_count'] -= quantity

                # 打印售卖成功信息
                print("图书售卖成功。")
                return
        # 如果没有找到指定的图书，打印提示信息
        print("未找到指定图书。")

    # 按名称查询
    elif choice == 2:
        # 输入要售卖的图书名称
        book_name = input("请输入要售卖的图书名称：")
        # 在图书列表中查找指定名称的图书
        for book in store['books']:
            # 如果找到了指定的图书，打印图书信息并返回
            if book['book_name'] == book_name:
                # 打印图书列表的表头
                print("图书编号\t图书名称\t图书类别\t进价\t售价\t已售数量\t库存数量")
                # 打印找到的图书的信息
                print(
                    f"{book['book_id']}\t\t{book['book_name']}\t{book['book_category']}\t\t{book['purchase_price']:.2f}\t{book['selling_price']:.2f}\t{book['sold_quantity']}\t\t{book['stock_count']}")

                # 输入售卖的数量
                quantity = int(input("请输入售卖的数量："))

                # 如果售卖数量大于库存数量，打印库存不足提示信息，结束函数
                if quantity > book['stock_count']:
                    print("库存不足，售卖失败。")
                    return

                # 增加已售数量，减少库存数量
                book['sold_quantity'] += quantity
                book['stock_count'] -= quantity

                # 打印售卖成功信息
                print("图书售卖成功。")
                return
        # 如果没有找到指定的图书，打印提示信息
        print("未找到指定图书。")

    # 无效选择
    else:
        print("无效选择。")


# 定义主函数
def main():
    # 创建一个空字典用于存储图书信息和总数
    store = {'books': [], 'book_count': 0}
    # 从文件中读取图书信息
    read_from_file(store)

    # 主循环，根据用户的选择执行相应的操作
    while True:
        # 打印菜单
        print_menu()
        # 读取用户的选择
        choice = int(input())

        # 执行相应的操作
        if choice == 1:
            add_book(store)
            save_to_file(store)
            input("输入0返回主菜单界面。")
            os.system('cls' if os.name == 'nt' else 'clear')
        elif choice == 2:
            search_book(store)
            input("输入0返回主菜单界面。")
            os.system('cls' if os.name == 'nt' else 'clear')
        elif choice == 3:
            modify_book(store)
            save_to_file(store)
            input("输入0返回主菜单界面。")
            os.system('cls' if os.name == 'nt' else 'clear')
        elif choice == 4:
            delete_book(store)
            save_to_file(store)
            input("输入0返回主菜单界面。")
            os.system('cls' if os.name == 'nt' else 'clear')
        elif choice == 5:
            sell_book(store)
            save_to_file(store)
            input("输入0返回主菜单界面。")
            os.system('cls' if os.name == 'nt' else 'clear')
        elif choice == 6:
            export_books(store)
            input("输入0返回主菜单界面。")
            os.system('cls' if os.name == 'nt' else 'clear')
        elif choice == 7:
            classify_books(store)
            input("输入0返回主菜单界面。")
            os.system('cls' if os.name == 'nt' else 'clear')
        elif choice == 8:
            sales_statistics(store)
            input("输入0返回主菜单界面。")
            os.system('cls' if os.name == 'nt' else 'clear')
        elif choice == 9:
            stock_statistics(store)
            input("输入0返回主菜单界面。")
            os.system('cls' if os.name == 'nt' else 'clear')
        elif choice == 10:
            print("退出程序。")
            break
        else:
            print("无效选择。")


# 当前模块作为主程序运行
if __name__ == "__main__":
    main()